?啟動(dòng)與關(guān)機(jī)
引導(dǎo)進(jìn)程
在描述windows引導(dǎo)進(jìn)程時(shí),我們將從系統(tǒng)安裝和處理引導(dǎo)支持文件開(kāi)始。設(shè)備驅(qū)動(dòng)是引導(dǎo)進(jìn)程關(guān)鍵部分,所以我們會(huì)解釋,在驅(qū)動(dòng)被加載和初始化的時(shí)候,引導(dǎo)進(jìn)程是如何控制每一時(shí)間段的方法。然后我們描述執(zhí)行子系統(tǒng)是如何初始化的和內(nèi)核是如何啟動(dòng)會(huì)話管理進(jìn)程smss.exe、Windows子系統(tǒng)和登陸進(jìn)程(Winlogon.exe)來(lái)載入用戶模式的。在此過(guò)程中,我們將會(huì)重點(diǎn)講述那些在屏幕上出現(xiàn)各種文本提示的時(shí)間段,以幫助你把你看到的內(nèi)部進(jìn)程與你看到的Windows引導(dǎo)過(guò)程聯(lián)系起來(lái)。
值得注意的是相對(duì)在IA64系統(tǒng)與x86和x64系統(tǒng)之間,引導(dǎo)進(jìn)程早期階段會(huì)有所不同。下面一節(jié)將描述x86和x64系統(tǒng)引導(dǎo)進(jìn)程細(xì)節(jié)部分,接著描述IA64引導(dǎo)進(jìn)程的細(xì)節(jié)部分。
x86和x64系統(tǒng)的預(yù)啟動(dòng)(引導(dǎo)前的準(zhǔn)備)
當(dāng)你按下計(jì)算機(jī)電源或者按下reset鍵時(shí)WINDOWS引導(dǎo)進(jìn)程并不會(huì)開(kāi)始。它是在你給你的計(jì)算機(jī)安裝WINDOWS系統(tǒng)的時(shí)候開(kāi)始的。在系統(tǒng)安裝程序(Windows Setup program)執(zhí)行期間的某個(gè)點(diǎn)上,系統(tǒng)的主硬盤(pán)分區(qū)被準(zhǔn)備了一些參與引導(dǎo)進(jìn)程的代碼。在我們深入這些代碼的作用之前,我們先看看WINDOWS是如何把這些代碼放到磁盤(pán)上和放在磁盤(pán)的什么位置。
從早期的MS-DOS延續(xù)下來(lái)一個(gè)標(biāo)準(zhǔn),就是在x86系統(tǒng)上把物理磁盤(pán)分割成卷。微軟操作系統(tǒng)把硬盤(pán)分割成稱之為分區(qū)(Partitions)的離散區(qū)域,并且用文件系統(tǒng)(即文件格式FAT和NTFS)把每個(gè)分區(qū)格式化為一個(gè)卷。一個(gè)硬盤(pán)能最多包含四個(gè)主分區(qū)。因?yàn)檫@種分配方式會(huì)限制一個(gè)磁盤(pán)只能劃分成四個(gè)卷,所以一個(gè)特殊的分區(qū)類型產(chǎn)生了,稱之為擴(kuò)展分區(qū)(Extended partition),擴(kuò)展分區(qū)允許每個(gè)主分區(qū)里包含最多四個(gè)額外的分區(qū)。擴(kuò)展分區(qū)可以包含還有擴(kuò)展分區(qū)的擴(kuò)展分區(qū),并且這個(gè)分區(qū)在一個(gè)磁盤(pán)空間允許的情況下?lián)碛袩o(wú)限有效的卷標(biāo)號(hào)碼。圖5-1顯示一個(gè)硬盤(pán)規(guī)劃的事例,表5-1總述了在x86和x64引導(dǎo)進(jìn)程的相關(guān)文件。
物理硬盤(pán)是以扇區(qū)(Sector)為單位來(lái)尋址的。在一臺(tái)IBM兼容PC上的一個(gè)硬盤(pán)扇區(qū)是典型的512字節(jié)。用MS-DOS的Fdisk應(yīng)用程序或者Windows安裝程序,把硬盤(pán)準(zhǔn)備成卷標(biāo)定義形式的用途是為了在硬盤(pán)的第一個(gè)扇區(qū)寫(xiě)入有一個(gè)扇區(qū)數(shù)據(jù)的稱為主引導(dǎo)記錄(MBR)的數(shù)據(jù)代碼(MBR分區(qū)將在第十章進(jìn)行描述)。這個(gè)MBR包含:一個(gè)含有可執(zhí)行指令(稱為引導(dǎo)代碼)的固定數(shù)量空間,和一個(gè)帶有四個(gè)定義為磁盤(pán)主分區(qū)位置入口的表(稱為分區(qū)表)。當(dāng)一個(gè)IBM兼容計(jì)算機(jī)引導(dǎo)時(shí),它執(zhí)行的第一個(gè)代碼被稱做BIOS,BIOS是被編碼到計(jì)算機(jī)的ROM里面的一段程序。BIOS選擇一個(gè)引導(dǎo)設(shè)備,讀這個(gè)設(shè)備的MBR到內(nèi)存,并且把控制權(quán)交給在MBR里的這個(gè)代碼。
? ? ? ?MBR通過(guò)Microsoft分區(qū)工具,像Windows Setup安裝程序里集成的分區(qū)工具和磁盤(pán)管理MMC加載件,寫(xiě)MBR到磁盤(pán)也經(jīng)過(guò)了讀取進(jìn)程和傳遞控制的過(guò)程。首先,MBR代碼掃描這主分區(qū)表,直到落到這樣一個(gè)分區(qū),這個(gè)分區(qū)包含一個(gè)表示可引導(dǎo)分區(qū)的標(biāo)簽。當(dāng)這個(gè)MBR找到至少一個(gè)這樣的標(biāo)簽,它會(huì)讀這個(gè)被標(biāo)記分區(qū)的第一個(gè)扇區(qū)到內(nèi)存,并且傳輸控制權(quán)給這個(gè)分區(qū)中的代碼。這類分區(qū)被稱為引導(dǎo)分區(qū)(boot partition),這樣的分區(qū)的第一個(gè)扇區(qū)被稱為引導(dǎo)扇區(qū)。定義為引導(dǎo)分區(qū)的卷標(biāo)被稱為系統(tǒng)卷標(biāo)(system volume)。
操作系統(tǒng)通常在沒(méi)有用戶干預(yù)下把引導(dǎo)扇區(qū)寫(xiě)入磁盤(pán)。例如,當(dāng)Windows安裝程序?qū)慚BR到一個(gè)硬盤(pán)時(shí),它也寫(xiě)一個(gè)引導(dǎo)扇區(qū)到這個(gè)磁盤(pán)的第一個(gè)可引導(dǎo)扇區(qū)。在安裝MS-DOS,Windows Me,Windows 98,或者Windows 95時(shí),你可能已經(jīng)創(chuàng)建一個(gè)MS-DOS引導(dǎo)扇區(qū)。Windows安裝程序檢測(cè)這個(gè)引導(dǎo)扇區(qū),看這個(gè)將被Windows引導(dǎo)扇區(qū)重寫(xiě)的引導(dǎo)扇區(qū)是否是一個(gè)有效的MS-DOS引導(dǎo)扇區(qū)。如果是,Windows安裝程序拷貝這個(gè)引導(dǎo)扇區(qū)的內(nèi)容到一個(gè)存在于分區(qū)根目錄下稱為Bootsect.dos的文件中。
在寫(xiě)入到一個(gè)分區(qū)的引導(dǎo)扇區(qū)之前,Windows安裝程序首先確保這個(gè)分區(qū)是被你指定的一個(gè)Windows支持的(FAT,F(xiàn)AT32,NTFS)文件系統(tǒng)格式化了(以及其他分區(qū)都要做類似格式化過(guò)程)。如果分區(qū)已經(jīng)被格式化,你可以指示安裝程序跳過(guò)這一步。否則,使用安裝程序格式化了這個(gè)引導(dǎo)分區(qū)以后,安裝程序拷貝Windows用在引導(dǎo)分區(qū)的文件(系統(tǒng)卷標(biāo))到系統(tǒng)卷中,這些文件包含兩個(gè)參與引導(dǎo)序列的文件:Ntldr和Ntdetect.com。
安裝程序的另一角色是創(chuàng)建一個(gè)引導(dǎo)菜單文件:Boot.ini,它存在于系統(tǒng)卷標(biāo)的根目錄。這個(gè)文件包含是從安裝程序安裝的這個(gè)版本的windows還是一些先前已經(jīng)安裝的Windows選擇引導(dǎo)的一個(gè)選項(xiàng)。如果Bootsect.dos包含一個(gè)有效的MS-DOS引導(dǎo)扇區(qū),Boot.ini創(chuàng)建的入口之一就是引導(dǎo)到該MS-DOS下。下面輸出的內(nèi)容顯示了一個(gè)在Windows XP之前安裝了MS-DOS雙引導(dǎo)計(jì)算機(jī)的Boot.ini文件
你會(huì)發(fā)現(xiàn)這個(gè)示例文件中Windows文件路徑很特別,是使用一種ARC命名規(guī)則的特殊語(yǔ)法。有三個(gè)變量被Windows用到這個(gè)語(yǔ)法中。第一,在前所述代碼中multi()語(yǔ)法,指示W(wǎng)indows用BIOS INT 13函數(shù)來(lái)載入系統(tǒng)文件。因此,這個(gè)multi()語(yǔ)法被介紹為,當(dāng)定位于引導(dǎo)卷標(biāo)的磁盤(pán)有一個(gè)支持INT-13的控制器時(shí)使用。如下就是multi()的語(yǔ)法:
multi(W)disk(X)rdisk(Y)partition(Z)
W是這個(gè)磁盤(pán)控制器號(hào)(也稱為磁盤(pán)序號(hào)),通常為0。X在multi()語(yǔ)法中一直是0。Y指定為附在控制器W的的具體物理硬盤(pán)。對(duì)于ATA控制器,這個(gè)數(shù)字介于0-3之間。對(duì)于SCSI控制器,這個(gè)號(hào)碼通常在0-15之間。Z顯示在物理硬盤(pán)上相應(yīng)引導(dǎo)卷標(biāo)的分區(qū)號(hào)碼。第一分區(qū)被指派為號(hào)碼1。
Ntbootdd.sys提供支持Windows磁盤(pán)的I/O服務(wù),這scsi() ARC語(yǔ)法依靠Ntbootdd.sys來(lái)通知windows去訪問(wèn)在引導(dǎo)卷標(biāo)的文件。該語(yǔ)法格式如下:
?
scsi(W)disk(X)rdisk(Y)partition(Z)
此語(yǔ)法中,W是控制器號(hào),X是附屬到控制器的物理硬盤(pán),也是介于0-15。Y指定了引導(dǎo)卷標(biāo)磁盤(pán)的SCSI邏輯單元號(hào)(LUN),通常為0。最后,Z是相應(yīng)驅(qū)動(dòng)卷標(biāo)分區(qū)號(hào),通常從1開(kāi)始。
這最后一種被Windows使用的語(yǔ)法是signature()語(yǔ)法。它指示W(wǎng)indows定位到括號(hào)中匹配第一個(gè)值的標(biāo)號(hào)磁盤(pán),不管與磁盤(pán)聯(lián)合的控制器號(hào),并且用Ntbootdd.sys去訪問(wèn)引導(dǎo)卷標(biāo)。一個(gè)磁盤(pán)簽名就是一個(gè)全局唯一標(biāo)識(shí)符(GUID),Windows安裝程序從MBR中的信息中生成該簽名,并且寫(xiě)到磁盤(pán)上。這個(gè)signature()語(yǔ)法如下:
signature(V)disk(X)rdisk(Y)partition(Z)
V是一個(gè)32位16進(jìn)制用于表示該磁盤(pán)的磁盤(pán)簽名。X是帶有特定簽名的物理硬盤(pán),并且它在系統(tǒng)中能與任何控制器發(fā)生緊密聯(lián)系。Y一直是0。Z就是引導(dǎo)卷標(biāo)所在的分區(qū)號(hào)碼。
Windows使用該語(yǔ)法于下面幾種情況:
1、引導(dǎo)卷標(biāo)的大小高于7.8GB,并且BIOS擴(kuò)展的INT-13函數(shù)(用于訪問(wèn)一個(gè)磁盤(pán)超過(guò)7.8GB的部分)不能訪問(wèn)整個(gè)卷標(biāo)情況下。
2、BIOS不支持?jǐn)U展的INT-13函數(shù)情況下。